// gulpfile.js
// gulp的入口文件

// 基本用法 ===========begin=============

// // gulp约定所有的任务都是异步的，所以任务结束后需要标识任务结束 done（）
// exports.foo = done => {
//   console.log('foo task working~');
//   done();
// }

// //  default默认任务，运行时不需要指定任务，直接 yarn gulp 就可以
// exports.default = done => {
//   console.log('default task working~');
//   done();
// }


// // gulp 4.0以前我们去注册任务是需要gulp模块了的一个方法实现的
// // gulp.task这种方式已经不建议使用，建议使用exports的形式导出任务
// const gulp = require('gulp');
// gulp.task('bar', done => {
//   console.log('bar task working~');
//   done();
// })

// 基本用法 ===========end=============





// 组合任务 ===========begin=============

// const { series, parallel } = require('gulp');

// const task1 = done => {
//   setTimeout(() => {
//     console.log('task1 working~');
//     done();
//   }, 1000);
// }

// const task2 = done => {
//   setTimeout(() => {
//     console.log('task2 working~');
//     done();
//   }, 1000);
// }

// const task3 = done => {
//   setTimeout(() => {
//     console.log('task3 working~');
//     done();
//   }, 1000);
// }

// // 串行任务结构  依次执行  （如：部署时 一步一步依次执行 需要使用串行任务）
// exports.foo = series(task1, task2, task3);
// // [17:09:03] Starting 'foo'...
// // [17:09:03] Starting 'task1'...
// // task1 working~
// // [17:09:04] Finished 'task1' after 1.01 s
// // [17:09:04] Starting 'task2'...
// // task2 working~
// // [17:09:05] Finished 'task2' after 1.01 s
// // [17:09:05] Starting 'task3'...
// // task3 working~
// // [17:09:06] Finished 'task3' after 1.01 s
// // [17:09:06] Finished 'foo' after 3.07 s
// // Done in 5.18s.

// //并行任务结构  同时执行   （如：需要同时编译js文件、css文件 就需要并行任务）
// exports.bar = parallel(task1, task2, task3);
// // [17:09:23] Starting 'bar'...
// // [17:09:23] Starting 'task1'...
// // [17:09:23] Starting 'task2'...
// // [17:09:23] Starting 'task3'...
// // task1 working~
// // [17:09:24] Finished 'task1' after 1.02 s
// // task2 working~
// // [17:09:24] Finished 'task2' after 1.03 s
// // task3 working~
// // [17:09:24] Finished 'task3' after 1.03 s
// // [17:09:24] Finished 'bar' after 1.06 s
// // Done in 3.21s.


// 组合任务 ===========end=============





// 异步任务 ===========begin=============

// const fs = require('fs');

// // 1.回调函数

// exports.callback = done => {
//   console.log('callback task ~');
//   done();
// }

// exports.callback_error = done => {
//   console.log('callback task ~');
//   done(new Error('task failed!'));
// }
 

// // 2.promise方式

// exports.promise = () => {
//   console.log('promise task ~');
//   return Promise.resolve();
// }

// exports.promise_error = () => {
//   console.log('promise task ~');
//   return Promise.reject(new Error('task failed!'));
// }

// // 3.async/await方式

// const timeout = time => {
//   return new Promise(resolve => {
//     setTimeout(resolve, time);
//   })
// }

// exports.async = async () => {
//   await timeout(1000);
//   console.log('async task~');
// }

// // 4.stream
// // 文件处理

// exports.stream = () => {
//   const readStream = fs.createReadStream('package.json');
//   const writeStream = fs.createWriteStream('temp.txt');

//   readStream.pipe(writeStream);
//   return readStream;
// }

// exports.stream = done => {
//   const readStream = fs.createReadStream('package.json');
//   const writeStream = fs.createWriteStream('temp.txt');

//   readStream.pipe(writeStream);
  
//   readStream.on('end', () => {
//     done();
//   })
// }

// 异步任务 ===========end=============







// 构建过程核心工作原理 ===========begin=============

const fs = require('fs');
const { Transform } = require('stream');

exports.default = () => {
  const read = fs.createReadStream('normalize.css');
  const write = fs.createWriteStream('normalize.min.css');
  const transform = new Transform({
    transform: (chunk, encoding, callback) => {
      const input = chunk.toString();
      const output = input.replace(/\s+/g,'').replace(/\/\*.+?\*\//g,'');
      callback(null,output);
    }
  });

  read.pipe(transform).pipe(write);
  return read;
}



// 构建过程核心工作原理 ===========end=============




